package com.a2j.utils.helper;

import com.a2j.beans.base.BaseBean;
import com.a2j.beans.base.BasePageBean;
import com.a2j.beans.base.IBasePage;

import java.util.List;

/**
 * Author: bzb
 * Data: 2022/1/11 21:47
 * Desc: 分页辅助类
 */
public class PageHelper<T> {
    private BasePageBean<T> data;

    public PageHelper() {}
    private PageHelper(BasePageBean<T> data) {
        this.data = data;

        // 总页数 = 总数 / rows
        // 方法1: 为防止最后一页未满时结果为小数,进行向上取整
//        data.setTotalPage((int) Math.ceil(count / data.getRows().doubleValue()));
        // 方法2: 总数 % 每一页行数, 如果能整除直接返回,如果有余数对页码+1
        int page = data.getTotal() / data.getRows();
        data.setTotalPage(data.getTotal() % data.getRows() == 0 ? page : ++page);
    }

    public BaseBean<BasePageBean<T>> create() {
        return BaseBean.success(data);
    }

    /**
     * 把前端传的page转成给数据库查询使用的index, 数据库index从0开始
     */
    private static int transformIndex(IBasePage record) {
        if (record == null) return 0;
        /*
         * limit用法
         * limit 5: 从0开始,查询5条数据
         * limit 5,3: 从6开始,往后3条数据
         *
         * 分页时page的变更公式: (page - 1) * rows
         * 推算:
         *  第一页10条: limit 0, 10
         *  第二页10条: limit 10, 10
         *  第三页10条: limit 20, 10
         */
        return (record.getPage() -1) * record.getRows();
    }

    /**
     * 填充page和rows对象, 转换page为index给数据查询使用
     */
    public static void checkPage(IBasePage record) {
        if (record == null) throw new NullPointerException("分页对象不能为null!");
        if (record.getPage() == null || record.getPage() < 1) record.setPage(1);
        if (record.getRows() == null || record.getRows() < 1) record.setRows(10);
        record.setPage(transformIndex(record));
    }

    public BaseBean<BasePageBean<T>> transformData(Integer index, Integer rows, int total, List<T> data) {
        // 把index转换回page
        if (index == null || index < 0) index = 1;
        if (rows == null || rows < 0) rows = 1;
        Integer page = index / rows + 1;

        BasePageBean<T> build = new BasePageBean.Builder<T>()
                .page(page)
                .rows(rows)
                .total(total)
                .list(data)
                .builder();
        return new PageHelper<T>(build).create();
    }
}
